package com.cs.framework.core.context;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.cache.CacheManager;
import org.springframework.context.support.AbstractXmlApplicationContext;

import com.cs.framework.common.util.CacheUtils;
import com.cs.framework.common.util.StringUtils;
import com.cs.framework.core.config.PropertyConfig;
import com.cs.framework.core.util.CoreConstant;

/**
 * 应用的上下文
 * 
 * @author hedongzhou
 * 
 */
public class CoreApplication extends AbstractXmlApplicationContext implements Application {

	/**
	 * 应用配置路径
	 */
	protected String appConfig;

	/**
	 * 模块公共配置路径
	 */
	protected String moduleCommonConfig;

	/**
	 * 存放模块上下文
	 */
	protected Map<String, Module> moduleMap = new HashMap<String, Module>();

	/**
	 * 属性配置信息
	 */
	protected Map<String, Object> propertyMap;

	/**
	 * 模块类型
	 */
	protected String moduleClass;

	public CoreApplication(String appConfig, String moduleCommonConfig) {
		this.appConfig = StringUtils.trim(appConfig);
		this.moduleCommonConfig = StringUtils.trim(moduleCommonConfig);
		this.moduleClass = CoreConstant.CS_MODULE_CLASS;
	}

	/**
	 * 初始化
	 */
	public void init() {
		// 初始化上下文配置
		initContextConfig();

		// 初始化属性配置信息
		initProperties();

		// 初始化模块上下文
		initModule();

		// 初始化缓存
		initCache();
	}

	/**
	 * 初始化上下文配置
	 */
	protected void initContextConfig() {
		// 加载spring配置
		this.setConfigLocations(appConfig.split(CoreConstant.CONF_SEPARATE));
		this.refresh();
	}

	/**
	 * 初始化属性配置信息
	 */
	protected void initProperties() {
		try {
			// 根据配置，获取属性配置对象
			PropertyConfig propConfig = (PropertyConfig) getBean(CoreConstant.CS_PROPERTY);
			propertyMap = propConfig.gePropertyMap();
		} catch (NoSuchBeanDefinitionException e) {
			// 如无配置信息，则创建空白对象，以防后续报错
			propertyMap = new HashMap<String, Object>();
		}
	}

	/**
	 * 初始化模块上下文
	 */
	protected void initModule() {
		// 获取模块池
		ModulePool modulePool = getBean(ModulePool.class);

		// 模块信息
		Map<String, String> modules = modulePool.getModuleMap();

		for (Entry<String, String> info : modules.entrySet()) {
			// 初始化模块
			Module module = ContextHelper.createModule(moduleClass, this, info.getKey(), info.getValue());
			module.init();
			moduleMap.put(module.getModuleId(), module);
		}
	}

	/**
	 * 初始化缓存
	 */
	protected void initCache() {
		try {
			CacheUtils.setCacheManager((CacheManager) this.getBean("cacheManager"));
		} catch (Exception e) {
		}
	}

	/**
	 * 获取属性配置信息
	 */
	public Map<String, Object> getPropertyMap() {
		return propertyMap;
	}

	/**
	 * 获取属性配置信息
	 * 
	 * @param key
	 *            键值
	 * @return
	 */
	public Object getProperty(String key) {
		return propertyMap.get(key);
	}

	/**
	 * 获取模块上下文
	 * 
	 * @param moduleId
	 *            模块Id
	 * @return
	 */
	public Module getModule(String moduleId) {
		return moduleMap.get(moduleId);
	}

	/**
	 * 获取所有的模块Id
	 */
	public Set<String> getModuleIdSet() {
		return moduleMap.keySet();
	}

	/**
	 * 获取模块事物配置路径
	 * 
	 * @return
	 */
	public String getModuleCommonConfig() {
		return moduleCommonConfig;
	}

}
